package ag;

import java.util.ArrayList;
import java.util.Random;

public class ProblemaMochila {
	
	private final static double[]valor = {5.0, 2.0, 3.0, 8.0, 9.0, 3.0, 2.0, 4.0, 5.0, 1.0, 2.0, 6.0, 3.0, 2.0};
	private final static double[]peso= {3.0, 5.0, 7.0, 2.0, 8.0, 4.0, 4.0, 3.0, 7.0, 2.0, 3.0, 5.0, 4.0, 3.0};
	
	private static int [] posCrescenteValor_Peso;
	private final static int numElementos = 14;
	private final static double Capacidade = 25.0;
	private int numIndividuos;
	private final Random random = new Random();
	
	public ProblemaMochila(){
		double [] valor_peso = new double [numElementos];
		posCrescenteValor_Peso = new int[numElementos]; 
		for(int i = 0 ; i < numElementos; i++){
			valor_peso[i] = valor[i]/peso[i];
		}
		
		for(int i = 0; i<numElementos; i++){
			double piorValue = Double.MAX_VALUE;
			for(int j = 0; j<numElementos; j++){
				if(valor_peso[j] <= piorValue){
					posCrescenteValor_Peso[i] = j;
					piorValue = valor_peso[j];
				}
			}
			valor_peso[posCrescenteValor_Peso[i]] = Double.MAX_VALUE;
		}
	}
	
	public ArrayList<String> geraPopulacao(int numIndividuos){
		this.setNumIndividuos(numIndividuos);
		ArrayList<String> populacao = new ArrayList<String>();
		for(int i = 0; i<numIndividuos; i++){
			String individuo = geraIndividuo();
			populacao.add(individuo);
			
		}
		
		return populacao;
	}
	private String geraIndividuo(){
		StringBuffer bufferTemp = new StringBuffer("00000000000000");
		StringBuffer bufferTemp2 = new StringBuffer("00000000000000");
		
		for(int i = 0; i< random.nextInt(8) ; i++){
			
			int randomico = random.nextInt(numElementos); // Mudei essa parte, do outro jeito que tava o bufferTemp2 recebia a referencia de bufferTemp1
			bufferTemp.setCharAt(randomico, '1');
			
			if(!validaIndividuo(bufferTemp.toString())){
				return bufferTemp2.toString();
			}
			bufferTemp2.setCharAt(randomico, '1');
		}
		
		return bufferTemp.toString();
	}
	public boolean validaIndividuo(String individuo){
		if(calculaPesoIndividuo(individuo) > Capacidade){
					return false;
		}
		return true;
	}
	public double calculaPesoIndividuo(String individuo){
		double pesoMochila = 0;
		for(int i = 0; i< numElementos ; i++){
			if(individuo.charAt(i)=='1'){
				pesoMochila += peso[i];
			}
		}
		return pesoMochila;
	}
	public double calculaValorIndividuo(String individuo){
		double valorFinal = 0;
		for(int i = 0; i< numElementos ; i++){
			if(individuo.charAt(i)=='1'){
				valorFinal += valor[i];
			}
		}
		
		return valorFinal;
	}
	public double getValor(int i){
		return valor[i];
	}
	public int getPiorValor(int i){
		return posCrescenteValor_Peso[i];
	}
	public int getNumElementos(){
		return numElementos;
	}
	public int getNumIndividuos() {
		return numIndividuos;
	}
	public void setNumIndividuos(int numIndividuos) {
		this.numIndividuos = numIndividuos;
	}
}
